/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package eeep.dao;

import eeep.entidades.Identificacao;
import eeep.entidades.Pessoa;
import eeep.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

/**
 *
 * @author Joao
 */
public class PessoaDAO {
    public void salvarPessoa(Pessoa pessoa){
        String sql = "Insert Into identificacao(nome_identificacao,valor_identificacao)\n" +
                     "values (?,?);\n" +
                     "Insert Into pessoa(nome_pessoa,genero_pessoa,\n" +
                     "data_nascimento_pessoa,nota_corte_escola,id_endereco,\n" +
                     "id_escola,id_identificacao) Values(?,?,?,?,\n" +
                     "(Select id_endereco From endereco \n" +
                     "Where rua_endereco=? and bairro_endereco=? and\n" +
                     "cidade_endereco=? and numero_endereco=?),\n" +
                     "(Select id_escola From escola Where login_escola=?),\n" +
                     "(Select id_identificacao From identificacao\n" +
                     "Where nome_identificacao=? and valor_identificacao=?));";

        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            // Cria uma conexão com o banco
            conn = ConnectionFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            // Adiciona o valor aos parametros da sql
            pstm.setString(1, pessoa.getIdentificacao().getNome());
            pstm.setString(2, pessoa.getIdentificacao().getValor());
            pstm.setString(3, pessoa.getNome());
            pstm.setString(4, pessoa.getGenero());
            pstm.setDate(5, new java.sql.Date(pessoa.getData_nascimento().getTime()));
            pstm.setDouble(6, pessoa.getNota_corte_escola());
            pstm.setString(7, pessoa.getEndereco().getRua());
            pstm.setString(8, pessoa.getEndereco().getBairro());
            pstm.setString(9, pessoa.getEndereco().getCidade());
            pstm.setString(10, pessoa.getEndereco().getNumero());
            pstm.setString(11, pessoa.getEscola().getLogin());
            pstm.setString(12, pessoa.getIdentificacao().getNome());
            pstm.setString(13, pessoa.getIdentificacao().getValor());

            // Executa a sql para inserir os dados
            pstm.execute();

        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            // Fecha as coneções
            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
    public ArrayList<Pessoa> getPessoaPorNome(String nome){
        String sql = "SELECT * FROM pessoa where nome_pessoa";

		Connection conn = null;
		PreparedStatement pstm = null;
		// Classe que vai recuperar os dados do banco de dados
		ResultSet rset = null;

		try {
			conn = ConnectionFactory.getConexao();

			pstm = conn.prepareStatement(sql);
                        pstm.setString(1, nome);

			rset = pstm.executeQuery();

			// Enquanto existir dados no banco de dados
			ArrayList <Pessoa> lista = new ArrayList(); 
                        while (rset.next()) {

				Pessoa pessoa = new Pessoa();
				

				// Recupera o nome do banco e atribui ele ao objeto

                                pessoa.setNome(rset.getString("nome_pessoa"));
				lista.add(pessoa);
			}
                        return lista;
		} catch (Exception e) {

			e.printStackTrace();
		} finally {

			try {

				if (rset != null) {

					rset.close();
				}

				if (pstm != null) {

					pstm.close();
				}

				if (conn != null) {
					conn.close();
				}

			} catch (Exception e) {

				e.printStackTrace();
			}
		}

		return null;
    }
    
    public Pessoa getPessoaPorIdentificacao(Identificacao identificacao){
        String sql = "Select nome_pessoa,genero_pessoa,data_nascimento_pessoa,\n" +
                     "nota_corte_escola From pessoa as p,identificacao as i\n" +
                     "Where p.id_identificacao=i.id_identificacao\n" +
                     "and nome_identificacao=? and valor_identificacao=?";

		Connection conn = null;
		PreparedStatement pstm = null;
		// Classe que vai recuperar os dados do banco de dados
		ResultSet rset = null;

		try {
			conn = ConnectionFactory.getConexao();

			pstm = conn.prepareStatement(sql);
                        pstm.setString(1, identificacao.getNome());
                        pstm.setString(2, identificacao.getValor());

			rset = pstm.executeQuery();

			// Enquanto existir dados no banco de dados
                        while (rset.next()) {

				Pessoa pessoa = new Pessoa();
				

				// Recupera o nome do banco e atribui ele ao objeto

                                pessoa.setNome(rset.getString("nome_pessoa"));
				pessoa.setGenero(rset.getString("genero_pessoa"));
                                pessoa.setNota_corte_escola(rset.getDouble("nota_corte_escola"));
                                pessoa.setData_nascimento(rset.getDate("data_nascimento_pessoa"));
                                pessoa.getIdentificacao().setNome(identificacao.getNome());
                                pessoa.getIdentificacao().setValor(identificacao.getValor());
                                return pessoa;
			}
		} catch (Exception e) {

			e.printStackTrace();
		} finally {

			try {

				if (rset != null) {

					rset.close();
				}

				if (pstm != null) {

					pstm.close();
				}

				if (conn != null) {
					conn.close();
				}

			} catch (Exception e) {

				e.printStackTrace();
			}
		}

		return null;
    }
    
    public void deletePessoa(Identificacao identificacao){
        String sql = "Delete From pessoa\n" +
                     "Where id_pessoa=(Select id_pessoa From pessoa as p, identificacao as i\n" +
                     "Where p.id_identificacao=i.id_identificacao and nome_identificacao=? and\n" +
                     "valor_identificacao=?);\n" +
                     "Delete From identificacao Where nome_identificacao=? and\n" +
                     "valor_identificacao=?;";

        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            // Cria uma conexão com o banco
            conn = ConnectionFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            // Adiciona o valor aos parametros da sql
            pstm.setString(1, identificacao.getNome());
            pstm.setString(2, identificacao.getValor());
            pstm.setString(3, identificacao.getNome());
            pstm.setString(4, identificacao.getValor());

            // Executa a sql para inserir os dados
            pstm.execute();

        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            // Fecha as coneções
            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
    public void atualizarPessoa(Pessoa pessoa,Identificacao identificacao){
        String sql = "Update identificacao Set nome_identificacao=?,\n" +
                     "valor_identificacao=? \n" +
                     "Where nome_identificacao=? and valor_identificacao=?;\n" +
                     "Update pessoa Set nome_pessoa=?,\n" +
                     "genero_pessoa=?, data_nascimento_pessoa=?,\n" +
                     "id_endereco=(Select id_endereco From endereco\n" +
                     "Where cidade_endereco=? and bairro_endereco=?\n" +
                     "and rua_endereco=? and numero_endereco=?), "+
                     "nota_corte_escola=?,\n" +
                     "From pessoa as p, identificacao as i\n" +
                     "Where p.id_identificacao=i.id_identificacao and\n" +
                     "nome_identificacao=? and valor_identificacao=?;";

        Connection conn = null;
        PreparedStatement pstm = null;
        try {
            // Cria uma conexão com o banco
            conn = ConnectionFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            // Adiciona o valor aos parametros da sql
            
            pstm.setString(1, pessoa.getIdentificacao().getNome());
            pstm.setString(2, pessoa.getIdentificacao().getValor());
            pstm.setString(3,identificacao.getNome());
            pstm.setString(4,identificacao.getValor());
            pstm.setString(5,pessoa.getNome()); 
            pstm.setString(6,pessoa.getGenero());
            pstm.setDate(7,new java.sql.Date(pessoa.getData_nascimento().getTime())); 
            pstm.setString(8,pessoa.getEndereco().getCidade() );
            pstm.setString(9,pessoa.getEndereco().getBairro());
            pstm.setString(10,pessoa.getEndereco().getRua());
            pstm.setString(11,pessoa.getEndereco().getNumero());
            pstm.setDouble(12,pessoa.getNota_corte_escola()); 
            pstm.setString(13, pessoa.getIdentificacao().getNome());
            pstm.setString(14, pessoa.getIdentificacao().getValor());
            pstm.setString(15,identificacao.getNome());
            pstm.setString(16,identificacao.getValor());

            // Executa a sql para inserir os dados
            pstm.execute();

        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            // Fecha as coneções
            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
}
